
// export const handleClick = () => console.log('被点击了！！！')
// document.body.addEventListener('click', handleClick)
// document.body.addEventListener('click', () => {
// 	console.log(123)
// })
// document.body.addEventListener('click', () => {
// 	console.log(456)
// })
// document.body.click()
// document.body.removeEventListener('click', handleClick)

interface EventRawState {
	type: string
	listeners: Function[]
}


export class MyEvent {
	eventList: EventRawState[] = []
	// 绑定事件
	on(type: string, callback: Function) {
		// 1. 检测事件是否存在
		const item = this.eventList.find(v => v.type === type);

		// 2. 判断
		if (item) {
			// 推入事件驱动函数
			item.listeners.push(callback)
		} else {
			// 推入新的事件对象
			this.eventList.push({
				type: type,
				listeners: [callback]
			})
		}
	}
	// 触发事件
	emit(type: string) {
		// 1. 判断事件是否存在
		const item = this.eventList.find(v => v.type === type);
		// 2. 存在触发事件
		if (item) {
			// 循环数组
			item.listeners.forEach(callback => {
				// 调用事件驱动函数
				callback()
			})
		} else {
			// 3. 不存在给与警告
			console.warn(`事件类型${type}未绑定, 请绑定该事件在调用`)
		}
	}
	// 解除事件
	off(type: string, callback: Function) {
		// 1. 查找是否存在
		const item = this.eventList.find(v => v.type === type);
		if (item) {
			item.listeners = item.listeners.filter(v => v !== callback)
		}
	}
	// 绑定事件， 但只触发一次
	once(type: string, callback: Function) {
		// 1. 检测事件是否存在
		const item = this.eventList.find(v => v.type === type);
		// 内部中间件函数
		const middleCallBack = () => {
			// 1.  正常调用
			callback();
			// 2. 删除自己
			if (item) {
				item.listeners = item.listeners.filter(v => v !== middleCallBack)
			}
		}
		// 2. 判断
		if (item) {
			// 推入事件驱动函数
			
			item.listeners.push(middleCallBack)
		} else {
			// 推入新的事件对象
			this.eventList.push({
				type: type,
				listeners: [middleCallBack]
			})
		}
	}
}

const ev = new MyEvent();

const handleClick = () => console.log('123')

ev.on('click', handleClick)

ev.once('click', () => console.log('456 只触发一次'))

ev.on('click', () => console.log('789'))

ev.emit('click')
console.log('---------------------------------------------------------------')
ev.off('click', handleClick)
ev.emit('click')



// const type = '1231231'

// const result = arr.find(v => v.type === type)
// console.log(result)



// click  () => {}
// click  () => {}
// qwe  () => {}
// click  () => { console.log(123) }